Prisma ORM
https://www.prisma.io/docs/orm/overview/introduction/what-is-prisma
Prisma ORM is an open-source next-generation ORM. It consists of the following parts:
Node.js と TypeScript のための ORM
主に以下の 3 つの要素から構成されている
・Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript
・Prisma Migrate: Migration system
・ Prisma Studio: GUI to view and edit data in your database.
セットアップ
インストール
code:sh
$ npm install prisma --save-dev
初期セットアップ
code:sh
$ npx prisma init
実行すると、prisma/schema.prisma と .env が作成される
prisma/schema.prisma
code:prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
generator: https://www.prisma.io/docs/orm/reference/prisma-schema-reference#generator
prisma generate 実行時にどのようなアセットが作成されるかを定義する
provider : プログラミング言語固有の Prisma Client を指定できる
https://www.prisma.io/docs/orm/prisma-schema/overview/generators
code:prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
datasource: https://www.prisma.io/docs/orm/reference/prisma-schema-reference#datasource
Prisma がどのようにデータベースに接続するかを定義する
code:.env
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
Model 定義
https://www.prisma.io/docs/orm/prisma-schema/data-model/models
model ブロックを用いて Model を定義する
https://www.prisma.io/docs/orm/prisma-schema/data-model/models#defining-models
code:schema.prisma
model Task {
id Int @id @default(autoincrement())
name String @db.VarChar(255)
dueDate String @db.VarChar(10)
status Status @default(NOT_STARTED)
description String?
createdAt DateTime @default(now()) @db.Timestamp(0)
updateAt DateTime @updatedAt @db.Timestamp(0)
}
@db.VarChar: デフォルトだと text に変換されるので、varchar になるように明示する
@db.Timestamp: 秒まで表示するようにする
フィールドで使用できる スカラ型
https://www.prisma.io/docs/orm/reference/prisma-schema-reference#model-field-scalar-types
enum ブロックを用いると、Enum を定義することも可能
https://www.prisma.io/docs/orm/prisma-schema/data-model/models#defining-enums
code:schema.prisma
enum Status {
NOT_STARTED
IN_PROGRESS
COMPLETED
}
マイグレーション
Prisma Migrate
https://www.prisma.io/docs/orm/prisma-migrate/getting-started
prisma migrate dev: ファイル生成 + 開発環境用のマイグレーションの実行
https://www.prisma.io/docs/orm/reference/prisma-cli-reference#migrate-dev
1. Reruns the existing migration history in the shadow database in order to detect schema drift (edited or deleted migration file, or a manual changes to the database schema)
2. Applies pending migrations to the shadow database (for example, new migrations created by colleagues)
3. Generates a new migration from any changes you made to the Prisma schema before running migrate dev
4. Applies all unapplied migrations to the development database and updates the _prisma_migrations table
5. Triggers the generation of artifacts (for example, Prisma Client)
code:sh
$ npx prisma migrate dev --name <ファイル名>
実行すると、prisma/migrations に SQL ファイルと、migration_lock.tomlが生成される
code:sql
-- CreateEnum
CREATE TYPE "Status" AS ENUM ('NOT_STARTED', 'IN_PROGRESS', 'COMPLETED');
-- CreateTable
CREATE TABLE "Task" (
"id" SERIAL NOT NULL,
"name" VARCHAR(255) NOT NULL,
"dueDate" VARCHAR(10) NOT NULL,
"status" "Status" NOT NULL DEFAULT 'NOT_STARTED',
"description" TEXT,
"createdAt" TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(0) NOT NULL,
CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
);
code:migration_lock.toml
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
リレーション: https://www.prisma.io/docs/orm/prisma-schema/data-model/relations
1対多のケース
code:schema.prisma
model Task {
...
userId Int
user User @relation(fields: userId, references: id, onDelete: Cascade)
}
model User {
...
Task Task[]
}
外部キー とモデルを取得するフィールドを追加する
モデルを取得するフィールドでは @relation を用いて関連データの情報を入力する
fields: 外部キーとなるフィールド名
references: fields が指す参照先モデルの ID
更新(onUpdate)・削除(onDelete)時のオプションを指定することも可能
#TypeScript